""""""
"""命名空间
在python解释器开始执⾏之后, 就会在内存中开辟⼀个空间, 每当遇到⼀个变量的时候, 就
把变量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内
存, 表⽰这个函数存在了, ⾄于函数内部的变量和逻辑, 解释器是不关⼼的. 也就是说⼀开始
的时候函数只是加载进来, 仅此⽽已, 只有当函数被调⽤和访问的时候, 解释器才会根据函数
内部声明的变量来进⾏开辟变量的内部空间. 随着函数执⾏完毕, 这些函数内部变量占⽤的空
间也会随着函数执⾏完毕⽽被清空

分类
全局命名空间: 我们直接在py文件中, 函数外声明的变量都属于全局命名空间
局部命名空间: 在函数中声明的变量会放在局部命名空间
内置命名空间: 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

加载顺序
1.内置命名空间
2.全局命名空间
3.局部命名空间(函数被执行的时候)
"""

"""作用域
全局作⽤域: 包含内置命名空间和全局命名空间. 在整个⽂件的任何位置都可以使⽤(遵循从上到下逐⾏执⾏). 
局部作⽤域: 在函数内部可以使⽤

a=1
def test():
    a=2
    b=3
    print(globals()) #查看全局作⽤域中的内容
    print(locals()) #查看局部作用域中的变量和函数信息

test()
"""
"""输出
{'__name__': '__main__', '__doc__': '', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000211F848>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/4.命名空间.py', '__cached__': None, 'a': 1, 'test': <function test at 0x00000000021F9288>}
{'a': 2, 'b': 3}
"""

"""global


a = 100
def func():
    global a #加了个global表示不再局部创建这个变量了. ⽽是直接使用全局的a
    a = 200
    print(a)
func()
print(a)
"""


"""nonlocal
nonlocal 表⽰在局部作用域中, 调用⽗级命名空间中的变量.
"""
a = 100
def test():
    a = 200
    def test1():
        nonlocal a
        a = 300
        print(a)
    test1()
    print(a)
test()
print(a)




